home *** CD-ROM | disk | FTP | other *** search
/ Tech Arsenal 1 / Tech Arsenal (Arsenal Computer).ISO / tek-19 / gpt32src.zip / LINEPROC.MAC < prev    next >
Text File  |  1991-06-03  |  2KB  |  127 lines

  1. ; lineproc.mac
  2. ; MASM macro definition for Bresenham line-drawing routine
  3. ; Colin Kelley
  4. ; January 13, 1987
  5.  
  6.  
  7. INCAX    equ 40h            ; for Self-Modifying Code
  8. INCBX    equ 43h
  9. DECAX    equ 48h
  10. DECBX    equ 4bh
  11.  
  12. ; usage:
  13. ;   lineproc linename, pixelname
  14. ;
  15. ; where linemane is the name you want for the proc, and pixelname is the
  16. ;   name of the routine that linename is to call to set pixels
  17. ;
  18.  
  19. lineproc macro linename, pixelname
  20. beginproc linename
  21.  
  22.     push bp
  23.     mov bp,sp
  24.     push si
  25.     push di
  26.     mov ax,[bp+X]        ; x1
  27.     mov bx,[bp+X+2]        ; y1
  28.     mov cx,[bp+X+4]        ; x2
  29.     mov si,[bp+X+6]        ; y2
  30.  
  31.     cmp ax,cx        ; x1,x2
  32.     jne i19
  33.     cmp bx,si        ; y1,y2
  34.     jne i19
  35.  
  36.     call pixelname
  37.  
  38.     jmp i28
  39. i19:
  40.     mov dx,ax        ; dx,x1
  41.     sub dx,cx        ; x2
  42.     jnc noabsx
  43.     neg dx
  44. noabsx:
  45.     mov di,bx        ; dy,y1
  46.     sub di,si        ; y2
  47.     jnc noabsy
  48.     neg di            ; dy
  49. noabsy:
  50.     cmp dx,di        ; dx,dy
  51.     jb i21            ; go iterate y's
  52. ;
  53. ; iterate x's
  54. ;
  55.     cmp bx,si        ; y1,y2
  56.     jb forwardy
  57.     mov byte ptr cs:yinc1,DECBX
  58.     jmp short i22
  59. forwardy:
  60.     mov byte ptr cs:yinc1,INCBX
  61. i22:
  62.     cmp ax,cx        ; x1,x2
  63.     jae l20004
  64.     mov byte ptr cs:xinc1,INCAX
  65.     jmp short l20005
  66. l20004:
  67.     mov byte ptr cs:xinc1,DECAX
  68. l20005:
  69.     mov bp,dx        ; sum,dx
  70.     shr bp,1        ; sum
  71. d23:
  72.     cmp ax,cx        ; x1,x2
  73.     je i28            ; done
  74. xinc1:    inc ax            ; may become inc or dec
  75.     add bp,di        ; sum,dy
  76.     cmp bp,dx
  77.     jb i27
  78.     sub bp,dx        ; sum,dx
  79. yinc1:    inc bx            ; may become inc or dec
  80. i27:
  81.     call pixelname
  82.     jmp short d23
  83.  
  84. ;
  85. ; else iterate y's
  86. ;
  87. i21:
  88.     cmp ax,cx        ; x1,x2
  89.     jae l20006
  90.     mov byte ptr cs:xinc2,INCAX
  91.     jmp short l20007
  92. l20006:
  93.     mov byte ptr cs:xinc2,DECAX
  94. l20007:
  95.     cmp bx,si        ; y1,y2
  96.     jb forwardy2
  97.     mov byte ptr cs:yinc2,DECBX
  98.     jmp short i29
  99. forwardy2:
  100.     mov byte ptr cs:yinc2,INCBX
  101. i29:
  102.     mov bp,di        ; sum,dy
  103.     shr bp,1        ; sum,1
  104. d30:
  105.     cmp bx,si        ; y1,y2
  106.     je i28
  107. yinc2:    inc bx            ; may become inc or dec
  108.     add bp,dx        ; sum,dx
  109.     cmp bp,di        ; sum,dy
  110.     jb i34
  111.     sub bp,di        ; sum,dy
  112. xinc2:    inc ax            ; may become inc or dec
  113. i34:
  114.     call near ptr pixelname
  115.     jmp short d30
  116. ;
  117. ; clean up and exit
  118. ;
  119. i28:
  120.     pop di
  121.     pop si
  122.     pop bp
  123.     ret
  124.  
  125. linename endp
  126.     endm
  127.